﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Course2
{
    /// <summary>
    /// 了解一些继承常识
    ///     所有的class类型都继承object，Nullable(注意基本类型的包装类型也是class类型)
    ///     所有的值类型都继承自ValueType(结构体和枚举都是值类型)
    ///     所有的枚举都继承自Enum
    ///     所有的数组都继承者Array
    /// 学习数组操作
    /// 集合及常用类型的使用
    /// 学习String
    ///     string和String的关系
    ///     string对象的创建
    ///     $内插值
    ///     @逐字符指定
    ///     字符串拼接
    /// 了解迭代器
    ///     统一迭代行为
    /// 了解正则
    ///     Regexp
    /// 了解转码器
    ///     Encoding
    /// 学习StringBuffer
    /// 学习索引器和迭代器
    /// 学习事件和委托
    /// 学习lambda表达式
    /// 学习linq
    /// 学习Datetime
    ///     了解时间戳
    /// 学校GUID
    /// 学习Convert
    ///     了解base64
    /// 学习ToString格式化
    ///     格式化数字
    ///     格式化日期
    ///     了解全球化（地区文化）
    /// 学校Math
    /// 学习Random
    /// 了解GC
    /// </summary>
    internal class Example
    {
        Array a = new int[20];
        public void NullableTest()
        {
            object o = 2;//注意这里会自动指向装箱操作，即new int?(2);
            int? i = 2;//同样会执行装箱操作box
            int i1 = (int)i;//可以强制拆箱,取消装箱
            int i2 = i.Value;//手动拆箱
            bool i3 = i.HasValue;//判断是否是null，注意即使i是null也不会抛出异常
            Nullable<int> i4 = i;//Nullable是int?的基类
            Nullable<double> i5 = 1.2;//同理
            i.GetValueOrDefault();//注意即注意即使i是null也不会抛出异常
        }
        /// <summary>
        /// char
        /// </summary>
        public void CharTest()
        {
            char.IsLower('a');//判断是否小写
            char.IsNumber('1');//判断是否是数字
            char.IsWhiteSpace('\0');//判断是否是空白字符（不可见的字符）
        }
        /// <summary>
        /// string
        /// </summary>
        public void StringTest()
        {
            string s0 = "fff";//可用不用new，
            var list = new string[] { "fafa", "7878" };
            string.Join(",", list);//fafa,7878,把字符串数组连接成一个新的字符串
            string.Join("", list);//fafa,7878
            //字符串本质是一个class,存储是用char数组,存储的，这个数组是string类的一个私有的字段
            string.Format("你好{0}我是{1}", "ls", "zs");//格式化字符串，{0}是后面参数的索引
            var s1 = new string("fff");//new,一定会创建一个新的内存
            var s2 = new string("fff");//字符串有常量，有常量池的概念
            Console.WriteLine(s1 == s2);//true注意string对==进行了重载，通过equals重载
            Console.WriteLine(s1.Equals(s2));//true
            Console.WriteLine(ReferenceEquals(s1, s2));//false
            Console.WriteLine((s1 as object) == (s1 as object));//false.注意运算符重载本质是静态函数之和类型相关，此时比较的是地址
            string s3 = default;
            string.IsNullOrEmpty(s3);
            var c = s1[0];//string实现了索引器，只读
            s1.IndexOf("aa");//查找模式所在的起始索引
            s1.TrimEnd();//移除末尾的所有空白字符（不可见的字符：空格，回车，等等）
            s1.TrimStart();//移除开头的所有空白字符
            s1.Trim();//移除前后所有空白字符
            s1.Contains("aaf");//判断是否包含aaf,true|false
            s1.Remove(0);//注意字符串不能更改，此时会产生一个新的字符串
            var sb = new StringBuilder();//如果涉及到对字符串大量修改建议使用StringBuilder
            sb.Append("fa");
            sb.AppendFormat("你好{0}我是{1}", "zs", "ls");
            var name = "zs";
            sb.Append($"你好{name},我今年{8}岁了");//插值语法，{}可以是变量和常量
            var s4 = sb.ToString();//转换成string

        }
        /// <summary>
        /// guid
        /// </summary>
        public void GuidTest()
        {
            //每一个guid都是全球唯一的
            Console.WriteLine(Guid.NewGuid());
            Console.WriteLine(Guid.NewGuid().ToString("N"));
        }
        public void ConvertTest()
        {
            Convert.ToInt16("45646");
            Convert.ToBoolean("False");
            Convert.ToBoolean("1");
            Convert.ToBoolean("0");
            //base可以让二进制正常显示
            Convert.ToBase64String(new byte[] { 1, 2, 3, 5, 80 });//二进制 to base64
            Convert.FromBase64String("fasfa==");//用于解析base64 to 二进制
        }
        /// <summary>
        /// 日期
        /// </summary>
        public void DateTimeTest()
        {
            //创建
            var date1 = new DateTime(2022, 12, 1);
            Console.WriteLine(date1.ToString("yyyy-MM-dd HH:mm:ss"));
            //解析1
            var time1 = DateTime.Parse("2022-12-12 12:00:10");
            //解析2
            var time2 = Convert.ToDateTime("2022-12-12 12:00:10");
            //解析3，格式解析
            var time3 = DateTime.ParseExact("2022#10#20", "yyyy#MM#dd", CultureInfo.CurrentCulture);
        }
        /// <summary>
        /// 用于描述时间跨度
        /// </summary>
        public void TimeSpanTest()
        {
            //构造，不常用
            var span0 = new TimeSpan(1,2,0);
            //得到一个跨度，常用
            var span = TimeSpan.FromSeconds(61);
            //通过跨度转换
            var m = span.TotalMinutes;
        }
        /// <summary>
        /// 正则
        /// </summary>
        public void RegexTet()
        {
            //匹配
            Regex.Match("我是张三，我的电话是6617219我的手机号是13165918841", "[0-9]{13,}");
            Regex.Matches("我是张三，我的电话是6617219我的手机号是13165918841", "[0-9]+");
            //替换
            //Regex.Replace();
        }
        /// <summary>
        /// 随机数
        /// </summary>
        public void RandomTest()
        {
            Random r = new Random();
            r.Next();
            r.Next(1, 10);//含前不含后
            r.NextDouble();//0-1的浮点数
        }
        /// <summary>
        /// 数学类
        /// </summary>
        public void MathTest()
        {
            Console.WriteLine(Math.PI);
            Console.WriteLine(Math.Pow(2, 10));//2的十次幂
        }

        public void FormatData()
        {
            double value = 123;
            //对齐
            Console.WriteLine(value.ToString("00000"));//toString
            Console.WriteLine(string.Format("{0:00000}", value));//Format
            Console.WriteLine(string.Format("{0}", value.ToString("00000")));
            //保留小数位数
            value = 1.2;
            Console.WriteLine(value.ToString("0.00", CultureInfo.InvariantCulture));
            Console.WriteLine(string.Format(CultureInfo.InvariantCulture,"{0:0.00}", value));
        }
    }

}
